package com.hundsun.cprs.yyt.service.match.core.queue.visitor;

import com.hundsun.cprs.yyt.service.match.core.queue.PriceCell;

/**
 * QueueVisitor的一个抽象实现，按次序获得读锁,访问所有的cell节点
 * 
 * @author fish
 * 
 */
public abstract class QueueSequenceVisitor implements QueueVisitor {

	public final void visit(PriceCell cell) {
		if (cell == null) {
			return;
		}
		cell.getReadLock().lock();
		try {
			if (!innerVisit(cell)) {
				return;
			}
		} finally {
			cell.getReadLock().unlock();
		}
		cell = cell.getNext();
		if (cell != null) {
			cell.accept(this);
		}
	}

	/**
	 * 按次序访问非null的cell节点，实现者不需要驱动访问下一个cell
	 * 访问时已经获得cell的读锁
	 * @param cell
	 * @return 如果为true，则继续访问下个节点，否则false的时候中止遍历
	 */
	public abstract boolean innerVisit(PriceCell cell);

}
